Temporal overview
p_year %>%
inner_join(poems,by=c("p_id")) %>%
count(collection,year) %>%
mutate(measure="yearly count") %>%
union_all(
p_year %>% # 10 year rolling mean
distinct(year) %>%
left_join(p_year %>% distinct(year),sql_on="RHS.year BETWEEN LHS.year-5 AND LHS.year+5") %>%
inner_join(p_year,by=c("year.y"="year")) %>%
inner_join(poems,by=c("p_id")) %>%
group_by(collection=collection,year=year.x) %>%
summarize(n=n()/10,.groups="drop") %>%
mutate(measure="10 year rolling mean")
) %>%
filter(year>0,year<9999,collection!="literary") %>%
ggplot(aes(x=year,y=n,color=measure)) +
geom_point(data=~.x %>% filter(measure=="yearly count")) +
geom_line(data=~.x %>% filter(measure=="10 year rolling mean")) +
theme_hsci_discrete(base_family="Arial") +
theme(legend.justification=c(0,1), legend.position=c(0.02, 0.98), legend.background = element_blank(), legend.key=element_blank()) +
labs(color=NULL) +
scale_y_continuous(breaks=seq(0,20000,by=2000),labels=scales::comma_format()) +
ylab("Poems") +
scale_x_continuous(breaks=seq(1000,2000,by=50)) +
xlab("Year") +
facet_wrap(~collection, ncol=1) +
ggtitle("Number of poems by year and collection")

p_year %>%
filter(year %in% c(0,9999)) %>%
left_join(poems) %>%
count(collection,year) %>%
ungroup() %>%
gt() %>%
tab_header(title=\Abnormal years\) %>%
fmt_integer(n)
Overview of collectors
poems %>%
distinct(collection) %>%
pull() %>%
map(~p_col %>%
inner_join(poems %>% filter(collection==.x),by=c("p_id")) %>%
count(col_id) %>%
left_join(collectors,by=c("col_id")) %>%
select(col_id,name,n) %>%
collect() %>%
mutate(col_id=fct_reorder(str_c(col_id,"|",name),n)) %>%
mutate(col_id=fct_lump_n(col_id,n=100,w=n)) %>%
mutate(col_id=fct_relevel(col_id,"Other")) %>%
group_by(col_id) %>%
tally(wt=n) %>% {
ggplot(.,aes(x=col_id,y=n)) +
geom_col() +
geom_text(aes(label=p(n)),hjust='left',nudge_y = 100) +
theme_hsci_discrete(base_family="Arial") +
coord_flip() +
labs(title=str_c("Collectors in ",.x))
}
)
Warning: 1 unknown level in `f`: Other
[[1]]
[[2]]
[[3]]
[[4]]




p_col %>%
anti_join(collectors) %>%
count(col_id) %>%
gt() %>%
tab_header(title=\Collectors without a name\) %>%
fmt_integer(n)
Geographical overview
d <- p_loc %>%
count(loc_id) %>%
inner_join(locations) %>%
select(name,n) %>%
collect()
poems_without_location <- poems %>%
anti_join(p_loc) %>%
count() %>%
pull()
unprojected_locations <- d %>%
anti_join(polygons) %>%
add_row(name=NA,n=poems_without_location)
polygons %>%
left_join(d) %>%
tm_shape() +
tm_polygons(col='n', id='name', style='fisher', palette='plasma') +
tm_layout(title=str_c(\Geographical overview. Missing \,unprojected_locations %>% tally(wt=n) %>% pull() %>% p,\ poems.\))

tm_tiles
#FFFFFF00
blank
Esri.WorldGrayCanvas
OpenStreetMap
Esri.WorldTopoMap
base
n
name
tm_fill
#666666
solid
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#7E03A8
#7E03A8
#BFBFBF
#0D0887
#7E03A8
#7E03A8
#F89441
#F89441
#CC4678
#CC4678
#0D0887
#0D0887
#0D0887
#BFBFBF
#7E03A8
#0D0887
#BFBFBF
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#F89441
#0D0887
#7E03A8
#7E03A8
#0D0887
#0D0887
#BFBFBF
#BFBFBF
#CC4678
#7E03A8
#0D0887
#0D0887
#7E03A8
#0D0887
#F89441
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#CC4678
#0D0887
#0D0887
#0D0887
#CC4678
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#BFBFBF
#7E03A8
#F89441
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#7E03A8
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#7E03A8
#CC4678
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#BFBFBF
#7E03A8
#0D0887
#0D0887
#7E03A8
#7E03A8
#0D0887
#7E03A8
#0D0887
#7E03A8
#BFBFBF
#7E03A8
#0D0887
#0D0887
#7E03A8
#7E03A8
#7E03A8
#CC4678
#7E03A8
#CC4678
#7E03A8
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#7E03A8
#BFBFBF
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#CC4678
#7E03A8
#0D0887
#7E03A8
#0D0887
#F89441
#7E03A8
#F89441
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#7E03A8
#BFBFBF
#CC4678
#CC4678
#7E03A8
#0D0887
#BFBFBF
#CC4678
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#CC4678
#BFBFBF
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#7E03A8
#CC4678
#0D0887
#BFBFBF
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#F89441
#BFBFBF
#7E03A8
#7E03A8
#7E03A8
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#7E03A8
#0D0887
#7E03A8
#7E03A8
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#CC4678
#BFBFBF
#0D0887
#0D0887
#F0F921
#7E03A8
#0D0887
#0D0887
#0D0887
#7E03A8
#BFBFBF
#BFBFBF
#0D0887
#7E03A8
#0D0887
#BFBFBF
#CC4678
#CC4678
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#BFBFBF
#0D0887
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#7E03A8
#F0F921
#0D0887
#0D0887
#CC4678
#BFBFBF
#0D0887
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#7E03A8
#BFBFBF
#0D0887
#7E03A8
#0D0887
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#BFBFBF
#BFBFBF
#7E03A8
#0D0887
#BFBFBF
#0D0887
#7E03A8
#0D0887
#7E03A8
#0D0887
#BFBFBF
#7E03A8
#0D0887
#7E03A8
#7E03A8
#BFBFBF
#0D0887
#0D0887
#CC4678
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#F89441
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#CC4678
#BFBFBF
#7E03A8
#7E03A8
#BFBFBF
#0D0887
#CC4678
#0D0887
#0D0887
#BFBFBF
#BFBFBF
#CC4678
#0D0887
#7E03A8
#BFBFBF
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#BFBFBF
#BFBFBF
#BFBFBF
#7E03A8
#0D0887
#0D0887
#0D0887
#CC4678
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#7E03A8
#CC4678
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#CC4678
#0D0887
#0D0887
#0D0887
#CC4678
#7E03A8
#7E03A8
#0D0887
#BFBFBF
#CC4678
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#7E03A8
#BFBFBF
#7E03A8
#BFBFBF
#7E03A8
#0D0887
#7E03A8
#0D0887
#0D0887
#CC4678
#0D0887
#7E03A8
#0D0887
#CC4678
#BFBFBF
#CC4678
#CC4678
#BFBFBF
#BFBFBF
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#7E03A8
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#BFBFBF
#7E03A8
#F89441
#0D0887
#0D0887
#BFBFBF
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#0D0887
#7E03A8
#0D0887
#7E03A8
#0D0887
#7E03A8
#BFBFBF
#0D0887
#7E03A8
#0D0887
#7E03A8
#7E03A8
#7E03A8
#7E03A8
#CC4678
#CC4678
#0D0887
#7E03A8
#0D0887
#0D0887
#BFBFBF
#F89441
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#7E03A8
#BFBFBF
#0D0887
#0D0887
#7E03A8
#7E03A8
#0D0887
#0D0887
#7E03A8
#0D0887
#CC4678
#CC4678
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#BFBFBF
#CC4678
#F89441
#7E03A8
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#F89441
#7E03A8
#0D0887
#CC4678
#0D0887
#CC4678
#CC4678
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#BFBFBF
#0D0887
#0D0887
#7E03A8
#0D0887
#7E03A8
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#CC4678
#7E03A8
#0D0887
#0D0887
#BFBFBF
#0D0887
#BFBFBF
#CC4678
#0D0887
#BFBFBF
#BFBFBF
#0D0887
#BFBFBF
#7E03A8
#BFBFBF
#0D0887
#0D0887
#F89441
#7E03A8
#0D0887
#7E03A8
#7E03A8
#BFBFBF
#7E03A8
#0D0887
#BFBFBF
#BFBFBF
#0D0887
#F0F921
#BFBFBF
#F0F921
#7E03A8
#0D0887
#0D0887
#CC4678
#CC4678
#CC4678
#0D0887
#7E03A8
#0D0887
#7E03A8
#0D0887
#CC4678
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#BFBFBF
#0D0887
#7E03A8
#7E03A8
#0D0887
#0D0887
#CC4678
#7E03A8
#CC4678
#CC4678
#0D0887
#7E03A8
#7E03A8
#CC4678
#F89441
#BFBFBF
#BFBFBF
#0D0887
#CC4678
#CC4678
#0D0887
#7E03A8
#0D0887
#0D0887
#7E03A8
#0D0887
#BFBFBF
#0D0887
#7E03A8
#0D0887
#7E03A8
#CC4678
#0D0887
#0D0887
#CC4678
#CC4678
#0D0887
#0D0887
#0D0887
#CC4678
#0D0887
#F89441
#BFBFBF
#0D0887
#0D0887
#7E03A8
#0D0887
#BFBFBF
#0D0887
#BFBFBF
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#CC4678
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#CC4678
#7E03A8
#7E03A8
#0D0887
#BFBFBF
#0D0887
#7E03A8
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#7E03A8
#0D0887
#7E03A8
#BFBFBF
#0D0887
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#CC4678
#0D0887
#7E03A8
#0D0887
#0D0887
#7E03A8
#F89441
#7E03A8
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#BFBFBF
#CC4678
#BFBFBF
#0D0887
#0D0887
#0D0887
#F89441
#F0F921
#CC4678
#BFBFBF
#0D0887
#7E03A8
#BFBFBF
#0D0887
#0D0887
#0D0887
#F0F921
#0D0887
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#7E03A8
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#0D0887
#BFBFBF
#0D0887
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#F89441
#0D0887
#0D0887
#CC4678
#BFBFBF
#BFBFBF
#BFBFBF
#7E03A8
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#7E03A8
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#CC4678
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#F89441
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#7E03A8
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#7E03A8
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#BFBFBF
#0D0887
#0D0887
#7E03A8
#0D0887
#BFBFBF
#0D0887
#CC4678
#7E03A8
#7E03A8
#F0F921
#F89441
#7E03A8
#0D0887
#BFBFBF
#F89441
1 to 312
312 to 847
847 to 1,732
1,732 to 3,075
3,075 to 3,985
Missing
#0D0887
#7E03A8
#CC4678
#F89441
#F0F921
#BFBFBF
#666666
n
n
name
to
Less
than
or
more
metric
png
Geographical overview. Missing 37,345 poems.
#FFFFFF
YlOrBr
RdYlGn
Set3
black
#000000
plain
#000000
#FFFFFF
right
vertical
left
bottom
#000000
plain
#000000
plain
to
Less
than
or
more
left
top
#000000
plain
#000000
plain
#CCCCCC
#000000
plain
left
bottom
right
bottom
left
bottom
Esri.WorldGrayCanvas
OpenStreetMap
Esri.WorldTopoMap
topright
left
top
grey85
grey40
grey60
black
black
black
grey75
grey95
Missing
dummy
.
km
none
km
km
Poem locations not mapped
unprojected_locations %>%
arrange(desc(n)) %>%
gt() %>%
tab_header(\Poem locations not mapped\) %>%
fmt_integer(n)
Geographical overview by collection
d <- p_loc %>%
left_join(poems) %>%
count(collection,loc_id) %>%
ungroup() %>%
inner_join(locations) %>%
select(collection,name,n) %>%
collect()
poems_without_location <- poems %>%
anti_join(p_loc) %>%
count(collection) %>%
collect() %>%
mutate(name=NA_character_)
unprojected_locations <- d %>%
anti_join(polygons) %>%
union_all(poems_without_location)
poems %>%
distinct(collection) %>%
pull() %>%
map(~
tm_shape(
polygons %>%
left_join(
p_loc %>%
inner_join(poems %>% filter(collection==.x),by=c(\p_id\)) %>%
count(loc_id) %>%
inner_join(locations) %>%
select(name,n) %>%
collect()
)
) +
tm_polygons(col='n', id='name', style='fisher', palette='plasma') +
tm_layout(title=str_c(\Geography of \,.x,\. Missing \,unprojected_locations %>% filter(collection==.x) %>% tally(wt=n) %>% pull() %>% p,\ poems.\))
)
[[1]]

[[2]]

[[3]]

[[4]]

Poem locations not mapped by collection
poems %>%
distinct(collection) %>%
pull() %>%
map(~
unprojected_locations %>%
filter(collection==.x) %>%
arrange(desc(n)) %>%
select(-collection) %>%
gt() %>%
tab_header(str_c("Poem locations not mapped in ",.x)) %>%
fmt_integer(n)
)
[[1]]
| name |
n |
| Narvusi |
3,202 |
| Vuole |
1,524 |
| Uusikirkko Vpl |
1,131 |
| Pyhäjärvi Vpl |
785 |
| Etelä-Karjala |
658 |
| Pohjois-Pohjanmaa |
557 |
| Länsipohja |
396 |
| Kiimaisjärvi |
363 |
| Etelä-Savo |
350 |
| Tveri |
294 |
| Viipuri mlk |
277 |
| Salo |
198 |
| Pieksämäki |
183 |
| Pyhäjärvi Ol |
160 |
| Koski Hl |
134 |
| Pohjois-Karjala |
129 |
| Uusikirkko Tl |
116 |
| Tulomajärvi |
115 |
| Tornio |
113 |
| Porvoo mlk |
112 |
| Pyhäjärvi Ul |
102 |
| Pohjois-Savo |
98 |
| Viena |
98 |
| Satakunta |
83 |
| Säräisniemi |
74 |
| Uusikaupunki |
71 |
| Heinola mlk |
62 |
| Häme |
61 |
| Ruija |
60 |
| Jyväskylä mlk |
52 |
| Keski-Inkeri |
49 |
| Hämeenlinna |
48 |
| Kovero |
47 |
| Tuutari=Tuuteri |
45 |
| Laatokan Karjala (Raja-Karjala) |
44 |
| Itä- ja Pohjois-Inkeri |
42 |
| Kainuu |
38 |
| Kuopio mlk |
35 |
| Peräpohjola |
33 |
| Varkaus |
30 |
| Kajaani mlk |
30 |
| Etelä-Pohjanmaa |
27 |
| Keminmaa |
26 |
| Varsinais-Suomi |
24 |
| Mänttä |
22 |
| Novgorodin alue |
22 |
| Kotka |
20 |
| Mikkeli mlk |
17 |
| Karjala Tl |
16 |
| Alajärvi |
16 |
| Kimito |
15 |
| Prunkkala |
14 |
| Savonlinna |
14 |
| Sortavala mlk |
13 |
| Revonlahti-Revolax |
12 |
| Alakiiminki |
11 |
| Taipale (Enontaipale) |
9 |
| Helsingin pit |
7 |
| Sulva-Solf-Solv |
7 |
| Siuntio |
6 |
| Mustasaari-Korsholm |
6 |
| Siipyy-Sideby |
6 |
| Uzmana |
6 |
| Suma |
6 |
| Lapväärtti-Lappfjärd |
5 |
| Vaasa |
5 |
| Lappeenranta |
4 |
| Kenjärvi |
4 |
| Vammala |
3 |
| Kirkkonummi |
3 |
| Kokkola-Gamlakarleby |
3 |
| Kuolajärvi |
3 |
| Uusimaa |
2 |
| Iisalmi mlk |
2 |
| Pietarsaari-Jakobstad |
2 |
| Jepua-Jeppo |
2 |
| Kouta |
2 |
| Länsi-Inkeri |
2 |
| Uusikaupunki mlk |
1 |
| Anjalankoski |
1 |
| Keski-Suomi |
1 |
| Lieksa |
1 |
| Raippaluoto-Replot |
1 |
| Kuhmoniemi |
1 |
[[2]]
| name |
n |
| NA |
2,008 |
| välismaa |
1,822 |
| Tartu |
973 |
| Tallinn |
685 |
| Viljandi l. |
602 |
| Pärnu l. |
598 |
| Viljandimaa |
480 |
| Võrumaa |
452 |
| Narva l. |
422 |
| Läänemaa |
329 |
| Rakvere l. |
304 |
| Saaremaa |
205 |
| Valga |
150 |
| Pärnumaa |
102 |
| Paide l. |
88 |
| Haapsalu |
86 |
| Võru l. |
60 |
| Valgamaa |
58 |
| Sõrve |
40 |
| Järvamaa |
39 |
| Virumaa |
36 |
| Tartumaa |
29 |
| Hiiumaa |
23 |
| Harjumaa |
17 |
| Kuressaare l. |
3 |
[[3]]
| name |
n |
| Narvusi |
1,780 |
| NA |
1,591 |
| Peräpohjola |
809 |
| Uusikirkko Vpl |
803 |
| Viena |
773 |
| Itä- ja Pohjois-Inkeri |
757 |
| Hämeenlinna |
517 |
| Keski-Inkeri |
483 |
| Viron Inkeri |
433 |
| Länsi-Inkeri |
424 |
| Sortavala mlk |
406 |
| Uusikaupunki |
386 |
| Tulomajärvi |
353 |
| Keminmaa |
349 |
| Pohjois-Pohjanmaa |
252 |
| Savonlinna |
240 |
| Pyhäjärvi Vpl |
215 |
| Lahti |
189 |
| Pyhäjärvi Ol |
164 |
| Pieksämäki |
163 |
| Säräisniemi |
159 |
| Vuole |
155 |
| Etelä-Pohjanmaa |
154 |
| Mikkeli mlk |
144 |
| Pyhäjärvi Ul |
143 |
| Viipuri mlk |
123 |
| Kuusankoski |
115 |
| Etelä-Karjala |
112 |
| Pohjois-Karjala |
111 |
| Pohjois-Savo |
110 |
| Tveri |
110 |
| Salo |
107 |
| Riihimäki |
104 |
| Helsingin pit |
96 |
| Mänttä |
91 |
| Kiimaisjärvi |
85 |
| Lapväärtti-Lappfjärd |
82 |
| Kainuu |
81 |
| Kotka |
76 |
| Alajärvi |
75 |
| Toijala |
70 |
| Laatokan Karjala (Raja-Karjala) |
63 |
| Etelä-Savo |
62 |
| Uusikirkko Tl |
61 |
| Lappeenranta |
59 |
| Tornio |
59 |
| Heinola mlk |
55 |
| Tuutari=Tuuteri |
55 |
| Pohjois-Pirkkala |
47 |
| Uusimaa |
44 |
| Kuopio mlk |
42 |
| Karjala Tl |
35 |
| Varkaus |
32 |
| Ruija |
31 |
| Kajaani mlk |
30 |
| Porvoo mlk |
22 |
| Storfjord |
20 |
| Parainen |
18 |
| Lappi Tl |
17 |
| Jyväskylä mlk |
17 |
| Vaasa |
17 |
| Vaala |
17 |
| Karkkila |
16 |
| Kouvola |
16 |
| Rovaniemi mlk |
16 |
| Kerava |
15 |
| Valkeakoski |
15 |
| Lieksa |
15 |
| Kuusisto |
13 |
| Muoslompolo |
13 |
| Uusikaupunki mlk |
12 |
| Hongonjoki |
12 |
| Satakunta |
12 |
| Novgorodin alue |
12 |
| Kemiö |
11 |
| Salo |
11 |
| Pieksämäki mlk |
11 |
| Iisalmi mlk |
11 |
| Pielisensuu |
11 |
| Särkisalo |
10 |
| Hamina |
10 |
| Kokkola-Gamlakarleby |
10 |
| Kristiinankaupunki-Kristinestad |
10 |
| Revonlahti-Revolax |
10 |
| Nauvo |
9 |
| Junosuando |
9 |
| Karesuando |
9 |
| Jämsänkoski |
8 |
| Koski Hl |
8 |
| Äänislinna |
8 |
| Kuhmoniemi |
7 |
| Muurmanni |
7 |
| Häme |
6 |
| Suolahti |
6 |
| Taipale |
6 |
| Mustasaari-Korsholm |
6 |
| Länsipohja |
6 |
| Rauma mlk |
5 |
| Kuolajärvi |
5 |
| Kistrand |
5 |
| Moseija |
5 |
| Kenjärvi |
5 |
| Imatra |
4 |
| Uusikaarlepyy-Nykarleby |
4 |
| Siipyy-Sideby |
4 |
| Yliveteli |
4 |
| Lauritsala |
3 |
| Ruukki |
3 |
| Koutokeino |
3 |
| Riipuskala |
3 |
| Varsinais-Suomi |
2 |
| Vammala |
2 |
| Järvenpää |
2 |
| Tiudia |
2 |
| Jaama |
2 |
| Prunkkala |
1 |
| Ikaalinen mlk |
1 |
| Myllykoski |
1 |
| Kirkkonummi |
1 |
| Loviisa |
1 |
| Sipoo |
1 |
| Nurmes mlk |
1 |
| Petolahti-Petalax |
1 |
| Oulu mlk |
1 |
| Nordkapp |
1 |
| Maasöy |
1 |
| Muodoslompolo |
1 |
| Pietari=Leningrad |
1 |
| Siestarjoki |
1 |
| Ahvenanmaa |
1 |
[[4]]
NA
Spatiotemporal overview
d <- poems %>%
left_join(p_year %>% mutate(year=if_else(year %in% c(0L,9999L),NA,year))) %>%
collect() %>%
mutate(year_ntile=ntile(year,11)) %>%
group_by(year_ntile) %>%
mutate(years=str_c(min(year),\-\,max(year))) %>%
ungroup() %>%
left_join(p_loc %>% collect()) %>%
count(years,loc_id) %>%
ungroup() %>%
left_join(locations %>% select(loc_id,name) %>% collect())
polygons %>%
left_join(d %>% complete(name,years)) %>%
tm_shape() +
tm_polygons(col='n', id='name', style='fisher', palette='plasma') +
tm_layout(main.title="Geographical overviews by time",legend.outside.size=0.1) +
tm_facets(by="years",ncol=4)
Joining, by = "name"

Poem verse statistics
Line types
d <- verses %>%
left_join(verse_poem) %>%
left_join(poems) %>%
count(collection,type) %>%
arrange(collection,desc(n)) %>%
collect()
Joining, by = "v_id"Joining, by = "p_id"
d %>%
group_by(collection) %>%
mutate(proportion=n/sum(n)) %>%
gt() %>%
fmt_integer(n) %>%
fmt_percent(proportion)
| type |
n |
proportion |
| skvr |
| V |
1,340,987 |
94.63% |
| L |
44,303 |
3.13% |
| CPT |
27,869 |
1.97% |
| K |
3,931 |
0.28% |
| erab |
| V |
1,861,583 |
93.39% |
| PAG |
53,040 |
2.66% |
| CPT |
19,844 |
1.00% |
| L |
18,465 |
0.93% |
| TYH |
18,357 |
0.92% |
| REF |
17,869 |
0.90% |
| LRY |
3,868 |
0.19% |
| RRE |
307 |
0.02% |
| MRK |
52 |
0.00% |
| U |
38 |
0.00% |
| LLI |
2 |
0.00% |
| TYP |
1 |
0.00% |
| jr |
| V |
812,343 |
90.94% |
| L |
49,411 |
5.53% |
| CPT |
28,030 |
3.14% |
| K |
3,502 |
0.39% |
| literary |
| V |
82,460 |
97.54% |
| L |
1,220 |
1.44% |
| CPT |
777 |
0.92% |
| K |
87 |
0.10% |
Verse line lengths
d_nr_characters <- verses_cl %>%
mutate(nr_characters=str_length(text)) %>%
left_join(verse_poem) %>%
left_join(poems) %>%
count(collection,nr_characters) %>%
ungroup() %>%
arrange(collection,desc(n)) %>%
collect()
Joining, by = "v_id"Joining, by = "p_id"
Verse line lengths in characters
d_nr_characters %>%
filter(nr_characters<=60) %>%
ggplot(aes(x=nr_characters,y=n)) +
geom_col(width=1) +
facet_wrap(~collection,scales="free_y") +
theme_hsci_discrete(base_family="Arial") +
scale_y_continuous(labels=scales::comma_format()) +
labs(title="Number of characters in verse lines")

d_nr_characters %>%
group_by(collection) %>%
mutate(prop=n/sum(n)) %>%
ungroup() %>%
filter(nr_characters<=60) %>%
ggplot(aes(x=nr_characters,y=collection,fill=collection,height=prop)) +
geom_density_ridges(stat='identity') +
theme_hsci_discrete(base_family="Arial") +
# scale_y_continuous(labels=scales::percent_format()) +
labs(title="Number of characters in verse lines")

Verse lines with more than 60 characters
d_nr_characters %>%
mutate(nl=if_else(nr_characters>60,n,0L)) %>%
group_by(collection) %>%
summarise(lines=sum(nl),proportion=sum(nl)/sum(n),.groups="drop") %>%
arrange(desc(lines)) %>%
gt() %>%
tab_header(title="Verse lines with more than 60 characters") %>%
fmt_integer(lines) %>%
fmt_percent(proportion)
| collection |
lines |
proportion |
| jr |
1,911 |
0.24% |
| erab |
291 |
0.02% |
| skvr |
202 |
0.02% |
| literary |
1 |
0.00% |
Verse line lengths in words
d_nr_words %>%
filter(nr_words<=10) %>%
ggplot(aes(x=nr_words,y=n)) +
geom_col(width=1) +
facet_wrap(~collection,scales="free_y") +
scale_x_continuous(breaks=seq(0,10,by=2)) +
scale_y_continuous(labels=scales::comma_format()) +
theme_hsci_discrete(base_family="Arial") +
labs(title="Number of words in verse lines")

d_nr_words %>%
filter(nr_words<=10) %>%
uncount(n) %>%
ggplot(aes(x=nr_words,y=collection,fill=collection)) +
stat_binline(binwidth=1) +
theme_hsci_discrete(base_family="Arial") +
scale_x_continuous(breaks=seq(0,10,by=2)) +
# scale_y_continuous(labels=scales::percent_format()) +
labs(title="Number of words in verse lines")

Verse lines with more than 10 words
d_nr_words %>%
mutate(nl=if_else(nr_words>10,n,0L)) %>%
group_by(collection) %>%
summarise(lines=sum(nl),proportion=sum(nl)/sum(n),.groups="drop") %>%
arrange(desc(lines)) %>%
gt() %>%
tab_header(title="Verse lines with more than 10 words") %>%
fmt_integer(lines) %>%
fmt_percent(proportion)
| collection |
lines |
proportion |
| jr |
839 |
0.11% |
| erab |
257 |
0.01% |
| skvr |
38 |
0.00% |
| literary |
9 |
0.01% |
d <- word_occ %>%
inner_join(words %>%
mutate(nr_characters=str_length(text))) %>%
group_by(v_id) %>%
summarise(nr_characters,nr_words=max(pos)) %>%
left_join(verse_poem) %>%
left_join(poems) %>%
count(collection,nr_words,pos,nr_characters) %>%
collect()
Joining, by = "w_id"Joining, by = "v_id"Joining, by = "p_id"Error: [0]
d %>%
group_by(collection,nr_words,pos) %>%
mutate(prop=n/sum(n)) %>%
ungroup() %>%
filter(nr_words>=2,nr_words<6) %>%
mutate(nr_words=as_factor(nr_words),pos=as_factor(pos)) %>%
uncount(n) %>%
ggplot(aes(x=nr_characters,y=nr_words,fill=nr_words)) +
stat_binline(binwidth=1) +
facet_grid(collection~pos,labeller = labeller(pos=label_both)) +
xlab("Number of characters in word") +
ylab("Number of words in verse") +
labs(
title="Number of characters in words by their position",
subtitle="According to length of verse and collection"
) +
theme_hsci_discrete(base_family="Arial")

LS0tCnRpdGxlOiAiR2VuZXJhbCBzdGF0aXN0aWNhbCBvdmVydmlld3Mgb2YgRklMVEVSIGRhdGEiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogeWVzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlPUZBTFNFLGRwaT03MixmaWcucmV0aW5hPTIsZmlnLndpZHRoPTgpCnNvdXJjZShoZXJlOjpoZXJlKCJjb2RlL2NvbW1vbl9iYXNpcy5SIiksIGxvY2FsID0ga25pdHI6OmtuaXRfZ2xvYmFsKCkpCmBgYAoKIyBUZW1wb3JhbCBvdmVydmlldwoKYGBge3IgdGVtcG9yYWxfb3ZlcnZpZXcsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CnBfeWVhciAlPiUgCiAgaW5uZXJfam9pbihwb2VtcyxieT1jKCJwX2lkIikpICU+JQogIGNvdW50KGNvbGxlY3Rpb24seWVhcikgJT4lCiAgbXV0YXRlKG1lYXN1cmU9InllYXJseSBjb3VudCIpICU+JQogIHVuaW9uX2FsbCgKICAgIHBfeWVhciAlPiUgIyAxMCB5ZWFyIHJvbGxpbmcgbWVhbgogICAgZGlzdGluY3QoeWVhcikgJT4lIAogICAgbGVmdF9qb2luKHBfeWVhciAlPiUgZGlzdGluY3QoeWVhciksc3FsX29uPSJSSFMueWVhciBCRVRXRUVOIExIUy55ZWFyLTUgQU5EIExIUy55ZWFyKzUiKSAlPiUKICAgIGlubmVyX2pvaW4ocF95ZWFyLGJ5PWMoInllYXIueSI9InllYXIiKSkgJT4lCiAgICBpbm5lcl9qb2luKHBvZW1zLGJ5PWMoInBfaWQiKSkgJT4lCiAgICBncm91cF9ieShjb2xsZWN0aW9uPWNvbGxlY3Rpb24seWVhcj15ZWFyLngpICU+JQogICAgc3VtbWFyaXplKG49bigpLzEwLC5ncm91cHM9ImRyb3AiKSAlPiUKICAgIG11dGF0ZShtZWFzdXJlPSIxMCB5ZWFyIHJvbGxpbmcgbWVhbiIpCiAgKSAlPiUKICBmaWx0ZXIoeWVhcj4wLHllYXI8OTk5OSxjb2xsZWN0aW9uIT0ibGl0ZXJhcnkiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhcix5PW4sY29sb3I9bWVhc3VyZSkpICsKICBnZW9tX3BvaW50KGRhdGE9fi54ICU+JSBmaWx0ZXIobWVhc3VyZT09InllYXJseSBjb3VudCIpKSArCiAgZ2VvbV9saW5lKGRhdGE9fi54ICU+JSBmaWx0ZXIobWVhc3VyZT09IjEwIHllYXIgcm9sbGluZyBtZWFuIikpICsKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKGJhc2VfZmFtaWx5PSJBcmlhbCIpICsgCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLCBsZWdlbmQucG9zaXRpb249YygwLjAyLCAwLjk4KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnMoY29sb3I9TlVMTCkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDAsMjAwMDAsYnk9MjAwMCksbGFiZWxzPXNjYWxlczo6Y29tbWFfZm9ybWF0KCkpICsKICB5bGFiKCJQb2VtcyIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgxMDAwLDIwMDAsYnk9NTApKSArCiAgeGxhYigiWWVhciIpICsKICBmYWNldF93cmFwKH5jb2xsZWN0aW9uLCBuY29sPTEpICsKICBnZ3RpdGxlKCJOdW1iZXIgb2YgcG9lbXMgYnkgeWVhciBhbmQgY29sbGVjdGlvbiIpCmBgYAoKYGBge3J9CnBfeWVhciAlPiUgCiAgZmlsdGVyKHllYXIgJWluJSBjKDAsOTk5OSkpICU+JSAKICBsZWZ0X2pvaW4ocG9lbXMpICU+JSAKICBjb3VudChjb2xsZWN0aW9uLHllYXIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGU9IkFibm9ybWFsIHllYXJzIikgJT4lCiAgZm10X2ludGVnZXIobikKYGBgCgojIE92ZXJ2aWV3IG9mIGNvbGxlY3RvcnMKCmBgYHtyIGNvbGxlY3RvcnNfb3ZlcnZpZXcsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTExfQpwb2VtcyAlPiUgCiAgZGlzdGluY3QoY29sbGVjdGlvbikgJT4lCiAgcHVsbCgpICU+JQogIG1hcCh+cF9jb2wgJT4lIAogICAgaW5uZXJfam9pbihwb2VtcyAlPiUgZmlsdGVyKGNvbGxlY3Rpb249PS54KSxieT1jKCJwX2lkIikpICU+JQogICAgY291bnQoY29sX2lkKSAlPiUKICAgIGxlZnRfam9pbihjb2xsZWN0b3JzLGJ5PWMoImNvbF9pZCIpKSAlPiUKICAgIHNlbGVjdChjb2xfaWQsbmFtZSxuKSAlPiUKICAgIGNvbGxlY3QoKSAlPiUKICAgIG11dGF0ZShjb2xfaWQ9ZmN0X3Jlb3JkZXIoc3RyX2MoY29sX2lkLCJ8IixuYW1lKSxuKSkgJT4lCiAgICBtdXRhdGUoY29sX2lkPWZjdF9sdW1wX24oY29sX2lkLG49MTAwLHc9bikpICU+JQogICAgbXV0YXRlKGNvbF9pZD1mY3RfcmVsZXZlbChjb2xfaWQsIk90aGVyIikpICU+JQogICAgZ3JvdXBfYnkoY29sX2lkKSAlPiUKICAgIHRhbGx5KHd0PW4pICU+JSB7CiAgICAgIGdncGxvdCguLGFlcyh4PWNvbF9pZCx5PW4pKSArCiAgICAgIGdlb21fY29sKCkgKwogICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPXAobikpLGhqdXN0PSdsZWZ0JyxudWRnZV95ID0gMTAwKSArCiAgICAgIHRoZW1lX2hzY2lfZGlzY3JldGUoYmFzZV9mYW1pbHk9IkFyaWFsIikgKwogICAgICBjb29yZF9mbGlwKCkgKwogICAgICBsYWJzKHRpdGxlPXN0cl9jKCJDb2xsZWN0b3JzIGluICIsLngpKQogICAgfQogICkKYGBgCgpgYGB7cn0KcF9jb2wgJT4lIAogIGFudGlfam9pbihjb2xsZWN0b3JzKSAlPiUKICBjb3VudChjb2xfaWQpICU+JQogIGd0KCkgJT4lCiAgdGFiX2hlYWRlcih0aXRsZT0iQ29sbGVjdG9ycyB3aXRob3V0IGEgbmFtZSIpICU+JQogIGZtdF9pbnRlZ2VyKG4pCmBgYAoKIyBHZW9ncmFwaGljYWwgb3ZlcnZpZXcKCmBgYHtyfQpkIDwtIHBfbG9jICU+JSAKICBjb3VudChsb2NfaWQpICU+JSAKICBpbm5lcl9qb2luKGxvY2F0aW9ucykgJT4lCiAgc2VsZWN0KG5hbWUsbikgJT4lCiAgY29sbGVjdCgpCgpwb2Vtc193aXRob3V0X2xvY2F0aW9uIDwtIHBvZW1zICU+JSAKICBhbnRpX2pvaW4ocF9sb2MpICU+JSAKICBjb3VudCgpICU+JSAKICBwdWxsKCkKCnVucHJvamVjdGVkX2xvY2F0aW9ucyA8LSBkICU+JQogIGFudGlfam9pbihwb2x5Z29ucykgJT4lCiAgYWRkX3JvdyhuYW1lPU5BLG49cG9lbXNfd2l0aG91dF9sb2NhdGlvbikKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTF9CnBvbHlnb25zICU+JQogIGxlZnRfam9pbihkKSAlPiUKICB0bV9zaGFwZSgpICsKICB0bV9wb2x5Z29ucyhjb2w9J24nLCBpZD0nbmFtZScsIHN0eWxlPSdmaXNoZXInLCBwYWxldHRlPSdwbGFzbWEnKSArCiAgdG1fbGF5b3V0KHRpdGxlPXN0cl9jKCJHZW9ncmFwaGljYWwgb3ZlcnZpZXcuIE1pc3NpbmcgIix1bnByb2plY3RlZF9sb2NhdGlvbnMgJT4lIHRhbGx5KHd0PW4pICU+JSBwdWxsKCkgJT4lIHAsIiBwb2Vtcy4iKSkKYGBgCgojIyBQb2VtIGxvY2F0aW9ucyBub3QgbWFwcGVkCgpgYGB7cn0KdW5wcm9qZWN0ZWRfbG9jYXRpb25zICU+JQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lCiAgZ3QoKSAlPiUKICB0YWJfaGVhZGVyKCJQb2VtIGxvY2F0aW9ucyBub3QgbWFwcGVkIikgJT4lCiAgZm10X2ludGVnZXIobikKYGBgCgojIyBHZW9ncmFwaGljYWwgb3ZlcnZpZXcgYnkgY29sbGVjdGlvbgoKYGBge3J9CmQgPC0gcF9sb2MgJT4lIAogIGxlZnRfam9pbihwb2VtcykgJT4lCiAgY291bnQoY29sbGVjdGlvbixsb2NfaWQpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgaW5uZXJfam9pbihsb2NhdGlvbnMpICU+JQogIHNlbGVjdChjb2xsZWN0aW9uLG5hbWUsbikgJT4lCiAgY29sbGVjdCgpCgpwb2Vtc193aXRob3V0X2xvY2F0aW9uIDwtIHBvZW1zICU+JSAKICBhbnRpX2pvaW4ocF9sb2MpICU+JSAKICBjb3VudChjb2xsZWN0aW9uKSAlPiUgCiAgY29sbGVjdCgpICU+JQogIG11dGF0ZShuYW1lPU5BX2NoYXJhY3Rlcl8pCgp1bnByb2plY3RlZF9sb2NhdGlvbnMgPC0gZCAlPiUKICBhbnRpX2pvaW4ocG9seWdvbnMpICU+JQogIHVuaW9uX2FsbChwb2Vtc193aXRob3V0X2xvY2F0aW9uKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTExfQpwb2VtcyAlPiUgCiAgZGlzdGluY3QoY29sbGVjdGlvbikgJT4lCiAgcHVsbCgpICU+JQogIG1hcCh+CiAgICB0bV9zaGFwZSgKICAgICAgcG9seWdvbnMgJT4lCiAgICAgICAgbGVmdF9qb2luKAogICAgICAgICAgcF9sb2MgJT4lIAogICAgICAgICAgICBpbm5lcl9qb2luKHBvZW1zICU+JSBmaWx0ZXIoY29sbGVjdGlvbj09LngpLGJ5PWMoInBfaWQiKSkgJT4lCiAgICAgICAgICAgIGNvdW50KGxvY19pZCkgJT4lIAogICAgICAgICAgICBpbm5lcl9qb2luKGxvY2F0aW9ucykgJT4lCiAgICAgICAgICAgIHNlbGVjdChuYW1lLG4pICU+JQogICAgICAgICAgICBjb2xsZWN0KCkKICAgICAgICApCiAgICApICsKICAgIHRtX3BvbHlnb25zKGNvbD0nbicsIGlkPSduYW1lJywgc3R5bGU9J2Zpc2hlcicsIHBhbGV0dGU9J3BsYXNtYScpICsKICAgIHRtX2xheW91dCh0aXRsZT1zdHJfYygiR2VvZ3JhcGh5IG9mICIsLngsIi4gTWlzc2luZyAiLHVucHJvamVjdGVkX2xvY2F0aW9ucyAlPiUgZmlsdGVyKGNvbGxlY3Rpb249PS54KSAlPiUgdGFsbHkod3Q9bikgJT4lIHB1bGwoKSAlPiUgcCwiIHBvZW1zLiIpKQogICkKYGBgCgojIyBQb2VtIGxvY2F0aW9ucyBub3QgbWFwcGVkIGJ5IGNvbGxlY3Rpb24KCmBgYHtyLCByZXN1bHRzPSJhc2lzIn0KcG9lbXMgJT4lIAogIGRpc3RpbmN0KGNvbGxlY3Rpb24pICU+JQogIHB1bGwoKSAlPiUKICBtYXAofgogICAgdW5wcm9qZWN0ZWRfbG9jYXRpb25zICU+JQogICAgICBmaWx0ZXIoY29sbGVjdGlvbj09LngpICU+JQogICAgICBhcnJhbmdlKGRlc2MobikpICU+JQogICAgICBzZWxlY3QoLWNvbGxlY3Rpb24pICU+JQogICAgICBndCgpICU+JQogICAgICB0YWJfaGVhZGVyKHN0cl9jKCJQb2VtIGxvY2F0aW9ucyBub3QgbWFwcGVkIGluICIsLngpKSAlPiUKICAgICAgZm10X2ludGVnZXIobikKICApCmBgYAoKIyBTcGF0aW90ZW1wb3JhbCBvdmVydmlldwoKYGBge3J9CmQgPC0gcG9lbXMgJT4lCiAgbGVmdF9qb2luKHBfeWVhciAlPiUgbXV0YXRlKHllYXI9aWZfZWxzZSh5ZWFyICVpbiUgYygwTCw5OTk5TCksTkEseWVhcikpKSAlPiUgCiAgY29sbGVjdCgpICU+JQogIG11dGF0ZSh5ZWFyX250aWxlPW50aWxlKHllYXIsMTEpKSAlPiUKICBncm91cF9ieSh5ZWFyX250aWxlKSAlPiUKICBtdXRhdGUoeWVhcnM9c3RyX2MobWluKHllYXIpLCItIixtYXgoeWVhcikpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbGVmdF9qb2luKHBfbG9jICU+JSBjb2xsZWN0KCkpICU+JSAKICBjb3VudCh5ZWFycyxsb2NfaWQpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgbGVmdF9qb2luKGxvY2F0aW9ucyAlPiUgc2VsZWN0KGxvY19pZCxuYW1lKSAlPiUgY29sbGVjdCgpKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTExfQpwb2x5Z29ucyAlPiUgCiAgbGVmdF9qb2luKGQgJT4lIGNvbXBsZXRlKG5hbWUseWVhcnMpKSAlPiUKICB0bV9zaGFwZSgpICsKICB0bV9wb2x5Z29ucyhjb2w9J24nLCBpZD0nbmFtZScsIHN0eWxlPSdmaXNoZXInLCBwYWxldHRlPSdwbGFzbWEnKSArCiAgdG1fbGF5b3V0KG1haW4udGl0bGU9Ikdlb2dyYXBoaWNhbCBvdmVydmlld3MgYnkgdGltZSIsbGVnZW5kLm91dHNpZGUuc2l6ZT0wLjEpICsKICB0bV9mYWNldHMoYnk9InllYXJzIixuY29sPTQpCmBgYAoKIyBQb2VtIHZlcnNlIHN0YXRpc3RpY3MKCiMjIExpbmUgdHlwZXMKCmBgYHtyfQpkIDwtIHZlcnNlcyAlPiUgCiAgbGVmdF9qb2luKHZlcnNlX3BvZW0pICU+JSAKICBsZWZ0X2pvaW4ocG9lbXMpICU+JSAKICBjb3VudChjb2xsZWN0aW9uLHR5cGUpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZShjb2xsZWN0aW9uLGRlc2MobikpICU+JQogIGNvbGxlY3QoKQpgYGAKCgpgYGB7cn0KZCAlPiUgCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgbXV0YXRlKHByb3BvcnRpb249bi9zdW0obikpICU+JQogIGd0KCkgJT4lCiAgZm10X2ludGVnZXIobikgJT4lCiAgZm10X3BlcmNlbnQocHJvcG9ydGlvbikKYGBgCgojIyBWZXJzZSBsaW5lIGxlbmd0aHMKCmBgYHtyfQpkX25yX2NoYXJhY3RlcnMgPC0gdmVyc2VzX2NsICU+JQogIG11dGF0ZShucl9jaGFyYWN0ZXJzPXN0cl9sZW5ndGgodGV4dCkpICU+JQogIGxlZnRfam9pbih2ZXJzZV9wb2VtKSAlPiUgCiAgbGVmdF9qb2luKHBvZW1zKSAlPiUgCiAgY291bnQoY29sbGVjdGlvbixucl9jaGFyYWN0ZXJzKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UoY29sbGVjdGlvbixkZXNjKG4pKSAlPiUKICBjb2xsZWN0KCkKCmRfbnJfd29yZHMgPC0gd29yZF9vY2MgJT4lCiAgZ3JvdXBfYnkodl9pZCkgJT4lCiAgc3VtbWFyaXNlKG5yX3dvcmRzPW1heChwb3MpLC5ncm91cHM9ImRyb3AiKSAlPiUKICBsZWZ0X2pvaW4odmVyc2VfcG9lbSkgJT4lCiAgbGVmdF9qb2luKHBvZW1zKSAlPiUgCiAgY291bnQoY29sbGVjdGlvbixucl93b3JkcykgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGNvbGxlY3Rpb24sZGVzYyhuKSkgJT4lCiAgY29sbGVjdCgpCmBgYAojIyMgVmVyc2UgbGluZSBsZW5ndGhzIGluIGNoYXJhY3RlcnMKYGBge3J9CmRfbnJfY2hhcmFjdGVycyAlPiUgCiAgZmlsdGVyKG5yX2NoYXJhY3RlcnM8PTYwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9bnJfY2hhcmFjdGVycyx5PW4pKSArCiAgZ2VvbV9jb2wod2lkdGg9MSkgKwogIGZhY2V0X3dyYXAofmNvbGxlY3Rpb24sc2NhbGVzPSJmcmVlX3kiKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hX2Zvcm1hdCgpKSArCiAgeGxhYigiTnVtYmVyIG9mIGNoYXJhY3RlcnMiKSArCiAgeWxhYigiVmVyc2VzIikgKwogIGxhYnModGl0bGU9Ik51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHZlcnNlIGxpbmVzIikKYGBgCgpgYGB7cn0KZF9ucl9jaGFyYWN0ZXJzICU+JSAKICBncm91cF9ieShjb2xsZWN0aW9uKSAlPiUKICBtdXRhdGUocHJvcD1uL3N1bShuKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihucl9jaGFyYWN0ZXJzPD02MCkgJT4lCiAgZ2dwbG90KGFlcyh4PW5yX2NoYXJhY3RlcnMseT1jb2xsZWN0aW9uLGZpbGw9Y29sbGVjdGlvbixoZWlnaHQ9cHJvcCkpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKHN0YXQ9J2lkZW50aXR5JykgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoYmFzZV9mYW1pbHk9IkFyaWFsIikgKwojICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSkgKwogIHhsYWIoIk51bWJlciBvZiBjaGFyYWN0ZXJzIikgKwogIHlsYWIoIlZlcnNlcyIpICsKICBsYWJzKHRpdGxlPSJOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiB2ZXJzZSBsaW5lcyIpCmBgYAoKCiMjIyBWZXJzZSBsaW5lcyB3aXRoIG1vcmUgdGhhbiA2MCBjaGFyYWN0ZXJzCgpgYGB7cn0KZF9ucl9jaGFyYWN0ZXJzICU+JSAKICBtdXRhdGUobmw9aWZfZWxzZShucl9jaGFyYWN0ZXJzPjYwLG4sMEwpKSAlPiUKICBncm91cF9ieShjb2xsZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UobGluZXM9c3VtKG5sKSxwcm9wb3J0aW9uPXN1bShubCkvc3VtKG4pLC5ncm91cHM9ImRyb3AiKSAlPiUKICBhcnJhbmdlKGRlc2MobGluZXMpKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGU9IlZlcnNlIGxpbmVzIHdpdGggbW9yZSB0aGFuIDYwIGNoYXJhY3RlcnMiKSAlPiUKICBmbXRfaW50ZWdlcihsaW5lcykgJT4lCiAgZm10X3BlcmNlbnQocHJvcG9ydGlvbikKYGBgCgoKIyMjIFZlcnNlIGxpbmUgbGVuZ3RocyBpbiB3b3JkcwpgYGB7cn0KZF9ucl93b3JkcyAlPiUgCiAgZmlsdGVyKG5yX3dvcmRzPD0xMCkgJT4lCiAgZ2dwbG90KGFlcyh4PW5yX3dvcmRzLHk9bikpICsKICBnZW9tX2NvbCh3aWR0aD0xKSArCiAgZmFjZXRfd3JhcCh+Y29sbGVjdGlvbixzY2FsZXM9ImZyZWVfeSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDEwLGJ5PTIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hX2Zvcm1hdCgpKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgeGxhYigiTnVtYmVyIG9mIHdvcmRzIikgKwogIHlsYWIoIlZlcnNlcyIpICsKICBsYWJzKHRpdGxlPSJOdW1iZXIgb2Ygd29yZHMgaW4gdmVyc2UgbGluZXMiKQpgYGAKCmBgYHtyfQpkX25yX3dvcmRzICU+JSAKICBmaWx0ZXIobnJfd29yZHM8PTEwKSAlPiUKICB1bmNvdW50KG4pICU+JQogIGdncGxvdChhZXMoeD1ucl93b3Jkcyx5PWNvbGxlY3Rpb24sZmlsbD1jb2xsZWN0aW9uKSkgKwogIHN0YXRfYmlubGluZShiaW53aWR0aD0xKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxMCxieT0yKSkgKwogIHhsYWIoIk51bWJlciBvZiB3b3JkcyIpICsKICB5bGFiKCJWZXJzZXMiKSArCiMgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArCiAgbGFicyh0aXRsZT0iTnVtYmVyIG9mIHdvcmRzIGluIHZlcnNlIGxpbmVzIikKYGBgCgojIyMgVmVyc2UgbGluZXMgd2l0aCBtb3JlIHRoYW4gMTAgd29yZHMKCmBgYHtyfQpkX25yX3dvcmRzICU+JSAKICBtdXRhdGUobmw9aWZfZWxzZShucl93b3Jkcz4xMCxuLDBMKSkgJT4lCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGxpbmVzPXN1bShubCkscHJvcG9ydGlvbj1zdW0obmwpL3N1bShuKSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgYXJyYW5nZShkZXNjKGxpbmVzKSkgJT4lCiAgZ3QoKSAlPiUKICB0YWJfaGVhZGVyKHRpdGxlPSJWZXJzZSBsaW5lcyB3aXRoIG1vcmUgdGhhbiAxMCB3b3JkcyIpICU+JQogIGZtdF9pbnRlZ2VyKGxpbmVzKSAlPiUKICBmbXRfcGVyY2VudChwcm9wb3J0aW9uKQpgYGAKCmBgYHtyfQp2ZXJzZV9ucl93b3JkcyA8LSB3b3JkX29jYyAlPiUgCiAgZ3JvdXBfYnkodl9pZCkgJT4lCiAgc3VtbWFyaXNlKG5yX3dvcmRzPW1heChwb3MpKSAlPiUKICBjb21wdXRlX2EodW5pcXVlX2luZGV4ZXM9bGlzdChjKCJ2X2lkIiwibnJfd29yZHMiKSkpCgp3b3JkX25yX2NoYXJhY3RlcnMgPC0gd29yZHMgJT4lCiAgbXV0YXRlKG5yX2NoYXJhY3RlcnM9c3RyX2xlbmd0aCh0ZXh0KSkgJT4lCiAgc2VsZWN0KHdfaWQsbnJfY2hhcmFjdGVycykgJT4lCiAgY29tcHV0ZV9hKHVuaXF1ZV9pbmRleGVzPWxpc3QoYygid19pZCIsIm5yX2NoYXJhY3RlcnMiKSkpCgpkIDwtIHdvcmRfb2NjICU+JQogIGxlZnRfam9pbih3b3JkX25yX2NoYXJhY3RlcnMpICU+JQogIGxlZnRfam9pbih2ZXJzZV9ucl93b3JkcykgJT4lCiAgbGVmdF9qb2luKHZlcnNlX3BvZW0gJT4lIHNlbGVjdCgtcG9zKSxieT1jKCJ2X2lkIikpICU+JSAKICBsZWZ0X2pvaW4ocG9lbXMpICU+JSAKICBjb3VudChjb2xsZWN0aW9uLG5yX3dvcmRzLHBvcyxucl9jaGFyYWN0ZXJzKSAlPiUKICBjb2xsZWN0KCkKYGBgCgpgYGB7cn0KZCAlPiUKICBncm91cF9ieShjb2xsZWN0aW9uLG5yX3dvcmRzLHBvcykgJT4lCiAgbXV0YXRlKHByb3A9bi9zdW0obikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIobnJfd29yZHM+PTIsbnJfd29yZHM8NikgJT4lCiAgbXV0YXRlKG5yX3dvcmRzPWFzX2ZhY3Rvcihucl93b3JkcykscG9zPWFzX2ZhY3Rvcihwb3MpKSAlPiUKICB1bmNvdW50KG4pICU+JQogIGdncGxvdChhZXMoeD1ucl9jaGFyYWN0ZXJzLHk9bnJfd29yZHMsZmlsbD1ucl93b3JkcykpICsKICBzdGF0X2JpbmxpbmUoYmlud2lkdGg9MSkgKwogIGZhY2V0X2dyaWQoY29sbGVjdGlvbn5wb3MsbGFiZWxsZXIgPSBsYWJlbGxlcihwb3M9bGFiZWxfYm90aCkpICsgCiAgeGxhYigiTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gd29yZCIpICsKICB5bGFiKCJOdW1iZXIgb2Ygd29yZHMgaW4gdmVyc2UiKSArCiAgbGFicygKICAgIHRpdGxlPSJOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiB3b3JkcyBieSB0aGVpciBwb3NpdGlvbiIsCiAgICBzdWJ0aXRsZT0iQWNjb3JkaW5nIHRvIGxlbmd0aCBvZiB2ZXJzZSBhbmQgY29sbGVjdGlvbiIKICAgICkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoYmFzZV9mYW1pbHk9IkFyaWFsIikKYGBgCgo=